package com.pyue.eam.admin.config;

import cn.hutool.cache.Cache;
import cn.hutool.cache.CacheUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.pyue.eam.admin.api.entity.SysDictItem;
import com.pyue.eam.admin.api.mate.BindType;
import com.pyue.eam.admin.service.SysDictItemService;
import com.pyue.eam.admin.service.SysUserService;
import com.pyue.eam.common.core.util.SpringContextHolder;
import com.pyue.eam.common.data.tenant.TenantContextHolder;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

// @Component
// public class DataBind implements IDataBind {
//
//     /**
//      * 从数据库或缓存中获取
//      */
//     private Cache<Long, String> fifoCache = CacheUtil.newFIFOCache(300, 180000);
//
//     @Resource
//     private RedisTemplate<String, String> redisTemplate;
//
//     @Override
//     public void setMetaObject(FieldBind fieldBind, Object fieldValue, MetaObject metaObject) {
//
//         DateUtil.today();
//         // 用户名称
//         if (BindType.USER_NAME.equals(fieldBind.type())) {
//             Long userId = Convert.toLong(fieldValue, null);
//             if (userId != null && !userId.equals(0L)) {
//                 metaObject.setValue(fieldBind.target(), userRealNameToMap(userId));
//             }
//         } else {
//             // 以下是字典
//             metaObject.setValue(fieldBind.target(), getDictLeval(fieldBind.type(), Convert.toStr(fieldValue, "")));
//         }
//     }
//
//     /**
//      * 获取字典内容
//      */
//     public String getDictLeval(String dictCode, String dictValue) {
//         dictCode = StrUtil.removePrefix(dictCode, BindType.DICT);
//
//         // 设置 key
//         String key = TenantContextHolder.getTenantId() + ":trans_dict:" + dictCode;
//
//         String result = redisTemplate.opsForValue().get(key);
//
//         if (StrUtil.isNotBlank(result)) {
//             List<SysDictItem> sysDictItemList = JSONUtil.toList(result, SysDictItem.class);
//             return getDictLabel(dictValue, sysDictItemList);
//         } else {
//             List<SysDictItem> sysDictItems = SpringContextHolder.getBean(SysDictItemService.class).dictByType(dictCode);
//             redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(sysDictItems), 120, TimeUnit.MINUTES);
//             return getDictLabel(dictValue, sysDictItems);
//         }
//     }
//
//     /**
//      * 获取字典label
//      */
//     private static String getDictLabel(String dictValue, List<SysDictItem> sysDictItemList) {
//         return sysDictItemList.stream()
//                 .filter(e -> dictValue.equals(e.getItemValue()))
//                 .findFirst()
//                 .map(SysDictItem::getLabel)
//                 .orElse("");
//     }
//
//     /**
//      * 获取用户名称
//      */
//     public String userRealNameToMap(Long userId) {
//         fifoCache = fifoCache == null ? CacheUtil.newFIFOCache(300, 180000) : fifoCache;
//
//         // 先从缓存中获取
//         return fifoCache.get(userId, () -> {
//             String name = SpringContextHolder.getBean(SysUserService.class).findRealNameById(Convert.toLong(userId, 0L));
//             fifoCache.put(userId, Convert.toStr(name, ""));
//             return name;
//         });
//     }
// }
